<?php

/**
 * Yii Controller AuthorizationController
 *
 * @author luubk
 * @since Jan 14, 2013 - 9:42:46 AM
 */
class AuthController extends BackController
{

    public $modelName = 'AuthItem';

    public function init()
    {
        parent::init();

        $controller = Yii::app()->controller->id;
        // Đưa vào menu của Controller
        $this->controllerMenu = array(
            array(
                'label' => Yii::t($controller, "Permissions"),
                'url' => $this->createUrl("$controller/permit", array(
                    'lang' => $this->lang,
                ))
            ),
            array(
                'label' => Yii::t($controller, "Role"),
                'url' => $this->createUrl("$controller/index", array(
                    'lang' => $this->lang,
                    'type' => AuthItem::TypeRole,
                ))
            ),
//            array(
//                'label' => Yii::t($controller, "Operation"),
//                'url' => $this->createUrl("$controller/index", array(
//                    'lang' => $this->lang,
//                    'type' => AuthItem::TypeOperation,
//                ))
//            ),
//            array(
//                'label' => Yii::t($controller, "Task"),
//                'url' => $this->createUrl("$controller/index", array(
//                    'lang' => $this->lang,
//                    'type' => AuthItem::TypeTask,
//                ))
//            ),
//            array(
//                'label' => Yii::t($controller, "Auto load"),
//                'url' => $this->createUrl("$controller/auto", array(
//                    'lang' => $this->lang,
//                    'type' => AuthItem::TypeTask,
//                ))
//            ),
        );
    }

    public function actionIndex()
    {
        /**
         * Hiển thị danh sách theo loại AuthItem
         */
        $auth = Yii::app()->authManager;
        $type = isset($_GET['type']) ? $_GET['type'] : AuthItem::TypeRole;
        switch ($type)
        {
            case AuthItem::TypeRole:
                $authItems = $auth->getRoles();
                $authName = Yii::t('auth', 'Role');
                break;
            case AuthItem::TypeOperation:
                $authItems = $auth->getOperations();
                $authName = Yii::t('auth', 'Operation');
                break;
            case AuthItem::TypeTask:
                $authItems = $auth->getTasks();
                $authName = Yii::t('auth', 'Task');
                break;
            default:
                break;
        }

        $this->render('index', array(
            'authItems' => $authItems,
            'type' => $type,
            'authName' => $authName,
        ));
    }

    protected function form($action = 'Create')
    {
        $this->model->type = $_GET['type'];
        parent::form($action);
    }

    protected function save($action = 'Create')
    {
        if (parent::save())
        {
            $childArray = isset($_POST['child']) ? $_POST['child'] : array();
            $this->model->name;
            $auth = Yii::app()->authManager;
            $authitem = $auth->getAuthItem($this->model->name);

            // Lấy tất cả các phần tử con đã có
            foreach ($authitem->getChildren() as $child)
            {
                // Nếu phần tử con không tồn tại trong mảng POST thì loại bỏ
                if (!isset($childArray[$child->name]))
                    $authitem->removeChild($child->name);
                // Nếu đã tồn tại thì loại khỏi mảng POST
                else
                    unset($childArray[$child->name]);
            }

            // Các phần tử còn lại sẽ được add làm con
            if (!empty($childArray))
            {
                foreach ($childArray as $childName => $value)
                    $authitem->addChild($childName);
            }

            return TRUE;
        }
        return FALSE;
    }

    public function urlAction($action, $pk, $type)
    {
        return $this->createUrl(Yii::app()->controller->id . "/$action", array(
                    'lang' => Yii::app()->language,
                    'pk' => $pk,
                    'type' => $type,
        ));
    }

    public function actionPermit()
    {
        if (isset($_POST['parent']) && isset($_POST['child']))
        {
            $auth = Yii::app()->authManager;
            $authitem = $auth->getAuthItem($_POST['parent']);
            $status = ($authitem->hasChild($_POST['child'])) ?
                    $authitem->removeChild($_POST['child']) :
                    $authitem->addChild($_POST['child']);

            if ($status)
            {
                $data = array(
                    'mess' => Yii::t('form', '{action} successful!', array(
                        '{action}' => Yii::t('auth', 'Permit'))
                    ),
                    'status' => 'ok'
                );
                die(json_encode($data));
            }
            else
            {
                $data = array(
                    'mess' => Yii::t('form', 'Can\'t do {action} , please try again!', array(
                        '{action}' => Yii::t('auth', 'Permit'))
                    ),
                    'status' => 'error'
                );
                die(json_encode($data));
            }
        }

        $this->pageTitle = Yii::t('auth', "Permissions");
        $this->render('permit');
    }

    public function actionAuto()
    {
        if (isset($_POST['auth']) && !empty($_POST['auth']))
        {
            $auth = Yii::app()->authManager;
            foreach ($_POST['auth'] as $authItem)
            {
                if ($auth->getAuthItem($authItem))
                    continue;

                $auth->createOperation($authItem, str_replace(".", " ", $authItem));
            }
        }

        $this->render('auto');
    }

}

/** 
 * End file AuthorizationController
 */
